package com.sywb.chuangyebao.contract;

import android.os.Bundle;

import com.sywb.chuangyebao.utils.Utils;
import com.tencent.rtmp.ui.TXCloudVideoView;
import com.tencent.ugc.TXRecordCommon;
import com.tencent.ugc.TXUGCPartsManager;
import com.tencent.ugc.TXUGCRecord;

import org.bining.footstone.log.Logger;
import org.bining.footstone.mvp.IView;
import org.bining.footstone.presenter.BasePresenter;

import java.io.File;

/**
 * 通过拍摄视频发布
 * Created by duxl on 2018/5/17.
 */

public interface PublishVideoFromCameraContract {

    interface View extends IView {

        TXCloudVideoView getSurfaceView();

        /**
         * 视频录制进度改变
         *
         * @param duration   视频的进度
         * @param isComplete 是否完成录制
         */
        void onProgressChanged(long duration, boolean isComplete);

        void onDrawReady();

        /**
         * 合并视频完成
         *
         * @param outputPath 合并后的视频路径
         */
        void onFinishedRecord(String outputPath);

        /**
         * 最大录制时间(ms)
         *
         * @return
         */
        int getMaxDuration();

        /**
         * 最小录制时间(ms)
         *
         * @return
         */
        int getMinDuration();

        /**
         * 达到最大时长
         */
        void onMaxDuration();
    }

    class Presenter extends BasePresenter<View> {

        private TXUGCRecord mTXCameraRecord;
        private TXCloudVideoView mTXCloudVideoView;
        private TXRecordCommon.TXUGCSimpleConfig mTXUGCSimpleConfig;
        private TXUGCPartsManager mTXUGCPartsManager;

        private boolean isDestroy = false;

        //        private AliyunIRecorder mRecorder;
//        private AliyunIClipManager mClipManager;
        private boolean mIsRecording;

        @Override
        public void onStart() {
            initRecorder();
        }

        private void initRecorder() {

//            mRecorder = AliyunRecorderCreator.getRecorderInstance(mContext);
//            mRecorder.setVideoQuality(VideoQuality.SSD);
//            // AliyunSnapVideoParam.RESOLUTION_540P
//            mRecorder.setDisplayView(mView.getSurfaceView());
//            mRecorder.setMediaInfo(getMediaInfo()); // 设置视频参数信息
//            mRecorder.setCamera(CameraType.BACK); // 设置后置摄像头
//            mRecorder.setRecordRotation(0); // 设置旋转角度
//            mRecorder.setFocusMode(CameraParam.FOCUS_MODE_CONTINUE); // 聚焦模式
//            String path = Utils.newRecordFile(mActivity).getAbsolutePath();
//            mRecorder.setOutputPath(path);
//            setRecordBack();
//            log("视频存储路径=" + path);
//            mClipManager = mRecorder.getClipManager();
//            mClipManager.setMaxDuration(mView.getMaxDuration());
//            mClipManager.setMinDuration(mView.getMinDuration());

            mTXCloudVideoView = mView.getSurfaceView();
            mTXCloudVideoView.enableHardwareDecode(true);

            mTXCameraRecord = TXUGCRecord.getInstance(mContext);
            mTXCameraRecord.setAspectRatio(TXRecordCommon.VIDEO_ASPECT_RATIO_9_16);

            //设置录制回调
            mTXCameraRecord.setVideoRecordListener(new TXRecordCommon.ITXVideoRecordListener() {
                @Override
                public void onRecordEvent(int i, Bundle bundle) {
                    Logger.e("onRecordEvent:" + i);
                }

                @Override
                public void onRecordProgress(long l) {
                    Logger.e("onRecordProgress:" + l);
                    mView.onProgressChanged(l, true);
                }

                @Override
                public void onRecordComplete(TXRecordCommon.TXRecordResult txRecordResult) {
                    // 反馈录制的结果，TXRecordResult 的 retCode 和 descMsg 字段分别表示错误码和错误描述信息，videoPath 表示录制完成的小视频文件路径，coverImage 为自动截取的小视频第一帧画面，便于在视频发布阶段使用。
                    if (!isDestroy) {
                        Logger.e("onRecordComplete:" + txRecordResult.videoPath);
                        mView.onFinishedRecord(txRecordResult.videoPath);
                    } else {
                        Utils.delFile(new File(txRecordResult.videoPath));
                    }
                }
            });

            mTXUGCSimpleConfig = new TXRecordCommon.TXUGCSimpleConfig();
            // mTXUGCSimpleConfig.videoQuality = TXRecordCommon.VIDEO_QUALITY_LOW;        // 360p
            mTXUGCSimpleConfig.videoQuality = TXRecordCommon.VIDEO_QUALITY_MEDIUM;        // 540p
            // mTXUGCSimpleConfig.videoQuality = TXRecordCommon.VIDEO_QUALITY_HIGH;        // 720p
            mTXUGCSimpleConfig.isFront = false; // 是否前置摄像头，使用
            mTXUGCSimpleConfig.minDuration = mView.getMinDuration(); // 视频录制的最小时长ms
            mTXUGCSimpleConfig.maxDuration = mView.getMaxDuration(); // 视频录制的最大时长ms

            mTXUGCPartsManager = mTXCameraRecord.getPartsManager();

            mTXCameraRecord.startCameraSimplePreview(mTXUGCSimpleConfig, mTXCloudVideoView);

        }

//        /**
//         * 视频参数信息
//         * 注意：录制时的分辨率是按照GLSurfaceView的实际宽高比，以设置的分辨率的宽为基准生成的，比如用户设置的分辨率是480x480，
//         * 如果GLSurfaceView的宽高比为9:16，则录制的视频分辨率为480:854，如果想要保持480x480的分辨率，则GLSurfaceView的宽高比要保持1:1。
//         * 硬编自适应开关如果设为true，则使用硬编（目前只支持硬编）时，如果宽／高不是16的倍数，则会强制转换为16的倍数，这样有一个影响就是
//         * 传入的分辨率与实际输出分辨率会有一点出入。而如果设置为false，则如果宽／高不是16的倍数，在调用setMediaInfo时将抛出IllegalArgumentException。
//         *
//         * @return
//         */
//        private MediaInfo getMediaInfo() {
//            MediaInfo mediaInfo = new MediaInfo();
//            mediaInfo.setVideoWidth(1080);
//            mediaInfo.setVideoHeight(1920);
//            mediaInfo.setHWAutoSize(true);
//            mediaInfo.setVideoCodec(VideoCodecs.H264_HARDWARE);
//            //mediaInfo.setAutoAdjustHWEncoder(true);//硬编时自适应宽高为16的倍数
//            return mediaInfo;
//        }

        /**
         * 是否在录制
         *
         * @return
         */
        public boolean isRecording() {
            return mIsRecording;
        }

        /**
         * 开始预览
         */
        public void startPreview() {
            mView.onDrawReady();
            mTXCameraRecord.startCameraSimplePreview(mTXUGCSimpleConfig, mTXCloudVideoView);
        }

        /**
         * 停止预览
         */
        public void stopPreview() {
            mTXCameraRecord.stopCameraPreview();
        }

        /**
         * 切换前后摄像头
         */
        public boolean switchCamera(boolean mFront) {
            // 切换前后摄像头 参数 mFront 代表是否前置摄像头 默认前置
            return mTXCameraRecord.switchCamera(mFront);
        }

        /**
         * 开始录制
         */
        public void startRecording() {
            if (!mIsRecording) {
                mIsRecording = true;
                mTXCameraRecord.startRecord();
            }
        }

        /**
         * 暂停录制
         */
        public void pauseRecording() {
            if (mIsRecording) {
                mIsRecording = false;
                mView.onDrawReady();
                mTXCameraRecord.pauseRecord();
            }
        }

        /**
         * 继续录制
         */
        public void resumeRecording() {
            if (!mIsRecording) {
                mIsRecording = true;
                mTXCameraRecord.resumeRecord();
            }
        }

        /**
         * 停止录制
         */
        public void stopRecording() {
            if (mIsRecording) {
                mIsRecording = false;
            }
            mTXCameraRecord.stopRecord();
        }

        /**
         * 删除最后一段片段
         */
        public void deletePart() {
            if (mTXUGCPartsManager != null) {
                mTXUGCPartsManager.deleteLastPart();
            }
        }

        /**
         * 删除所有片段
         */
        public void deleteAllPart() {
            if (mTXUGCPartsManager != null) {
                mTXUGCPartsManager.deleteAllParts();
            }
        }

        public void onDestroy() {
            if (mTXCameraRecord != null) {
                isDestroy = true;
                stopRecording();
                stopPreview();
                mTXCameraRecord = null;
            }
        }
    }
}

//// 设置美颜 和 美白 效果级别
//// beautyDepth     : 美颜级别取值范围 0 ~ 9； 0 表示关闭 1 ~ 9值越大 效果越明显。
//// whiteningDepth  : 美白级别取值范围 0 ~ 9； 0 表示关闭 1 ~ 9值越大 效果越明显。
//mTXCameraRecord.setBeautyDepth(beautyDepth, whiteningDepth);
//
//// 设置颜色滤镜：浪漫、清新、唯美、粉嫩、怀旧...
//// Bitmap     : 指定滤镜用的颜色查找表。注意：一定要用png格式！！！
//// demo用到的滤镜查找表图片位于RTMPAndroidDemo/app/src/main/res/drawable-xxhdpi/目录下。
//// setSpecialRatio : 用于设置滤镜的效果程度，从0到1，越大滤镜效果越明显，默认取值0.5
//        mTXCameraRecord.setFilter(filterBitmap);
//        mTXCameraRecord.setSpecialRatio(0.5);
//// 设置全局水印TXRect-水印相对于视频图像的归一化值，sdk内部会根据水印宽高比自动计算height
//// 比如视频图像大小为（540，960） TXRect三个参数设置为0.1，0.1，0.1,
//// 水印的实际像素坐标为（540 * 0.1，960 * 0.1，540 * 0.1 ，
//// 540 * 0.1 * watermarkBitmap.height / watermarkBitmap.width）
//        setWatermark(watermarkBitmap, txRect)
//// 设置绿幕文件:目前图片支持jpg/png，视频支持mp4/3gp等Android系统支持的格式
//        setGreenScreenFile(path, isLoop);
//// 设置美颜风格：光滑，自然，朦胧
//        setBeautyStyle(style);
//
//// 是否打开闪光灯 参数 mFlashOn 代表是否打开闪关灯 默认关闭
//        mTXCameraRecord.toggleTorch(mFlashOn);
//// 获取摄像头支持的最大焦距
//        mTXCameraRecord.mTXCameraRecord();
//// 设置焦距
//        mTXCameraRecord.setZoom(value);
//// 设置录制的宽高比
//// TXRecordCommon.VIDEO_ASPECT_RATIO_9_16 宽高比为9:16
//// TXRecordCommon.VIDEO_ASPECT_RATIO_3_4  宽高比为3:4
//// TXRecordCommon.VIDEO_ASPECT_RATIO_1_1  宽高比为1:1
//        mTXCameraRecord.setAspectRatio(TXRecordCommon.VIDEO_ASPECT_RATIO_9_16);
////////////////////////////////////////////////////////////////////////////
////                      截图
////////////////////////////////////////////////////////////////////////////
//        mTXCameraRecord.snapshot(new TXRecordCommon.ITXSnapshotListener() {
//@Override
//public void onSnapshot(Bitmap bmp) {
//        // 保存或者显示截图
//        }
//        });
////////////////////////////////////////////////////////////////////////////
////                      人声处理相关
////////////////////////////////////////////////////////////////////////////
//// 设置混响
//// TXRecordCommon.VIDOE_REVERB_TYPE_0 关闭混响
//// TXRecordCommon.VIDOE_REVERB_TYPE_1 KTV
//// TXRecordCommon.VIDOE_REVERB_TYPE_2 小房间
//// TXRecordCommon.VIDOE_REVERB_TYPE_3 大会堂
//// TXRecordCommon.VIDOE_REVERB_TYPE_4 低沉
//// TXRecordCommon.VIDOE_REVERB_TYPE_5 洪亮
//// TXRecordCommon.VIDOE_REVERB_TYPE_6 金属声
//// TXRecordCommon.VIDOE_REVERB_TYPE_7 磁性
//        mTXCameraRecord.setReverb(TXRecordCommon.VIDOE_REVERB_TYPE_1);
//// 设置变声
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_0  关闭变声
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_1  熊孩子
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_2  萝莉
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_3  大叔
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_4  重金属
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_6  外国人
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_7  困兽
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_8  死肥仔
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_9  强电流
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_10 重机械
//// TXRecordCommon.VIDOE_VOICECHANGER_TYPE_11 空灵
//        mTXCameraRecord.setVoiceChangerType(TXRecordCommon.VIDOE_VOICECHANGER_TYPE_1);
////////////////////////////////////////////////////////////////////////////
////                      背景音相关
////////////////////////////////////////////////////////////////////////////
//// 设置背景音乐播放回调接口.TXRecordCommon.ITXBGMNotify
//        setBGMNofify(notify);
//// 播放背景音
//        mTXCameraRecord.playBGM(path);
//// 停止播放背景音
//        mTXCameraRecord.stopBGM();
//// 暂停播放背景音
//        mTXCameraRecord.pauseBGM();
//// 继续播放背景音
//        mTXCameraRecord.resumeBGM();
//// 设置麦克风的音量大小，播放背景音混音时使用，用来控制麦克风音量大小
//// 音量大小,1为正常音量,建议值为0~2,如果需要调大音量可以设置更大的值.
//        mTXCameraRecord.setMicVolume(x);
//// 设置背景音乐的音量大小，播放背景音乐混音时使用，用来控制背景音音量大小
//// 音量大小,1为正常音量,建议值为0~2,如果需要调大背景音量可以设置更大的值.
//        setBGMVolume(x);
//// 设置背景音乐播放的开始位置和结束位置
//        mTXCameraRecord.seekBGM(startTime, endTime);
